#include "swpwm.h"

/***********************************************************************************
 * @brief       初始化PWM
 * @param       resolution： PWM占空比分辨率
 *              freq： PWM信号频率
 * @retval      无
 *************************************************************************************/
void pwm_init(uint8_t resolution, uint16_t freq)
{
    //ledc_timer_config_t ledc_timer = {0};           /* LEDC定时器句柄 */
    //ledc_channel_config_t ledc_channel = {0};       /* LEDC通道配置句柄 */

    /* 配置LEDC定时器 */
    ledc_timer_config_t ledc_timer={
        .duty_resolution = resolution,        /* PWM占空比最大值，即(2^resolution)-1*/
        .freq_hz = freq,                      /* PWM信号频率 1kHz频率（适合灯光）*/
        .speed_mode = LEDC_LOW_SPEED_MODE,    /* 定时器模式 */
        .timer_num = LEDC_PWM_TIMER,          /* 定时器序号 */
        .clk_cfg = LEDC_AUTO_CLK             /* LEDC时钟源 */
    };
    ledc_timer_config(&ledc_timer);                 /* 配置定时器 */

    /* 配置LEDC通道 */
    ledc_channel_config_t ledc_channel ={
            .gpio_num = LEDC_PWM_CH0_GPIO,      /* LED控制器通道对应引脚 */
            .speed_mode = LEDC_LOW_SPEED_MODE,  /* LEDC高速模式 */
            .channel = LEDC_PWM_CH0_CHANNEL,    /* LEDC控制器通道号 */
            .intr_type = LEDC_INTR_DISABLE,     /* LEDC失能中断 */
            .timer_sel = LEDC_PWM_TIMER,        /* 定时器序号 */
            .duty = 0                          /* 占空比值 */
    };
    ledc_channel_config(&ledc_channel);             /* 配置LEDC通道 */
}


/*******************************************************************************
 * @brief       PWM占空比设置
 * @param       duty：PWM占空比
 * @retval      无
 ******************************************************************************/
void pwm_set_duty(uint16_t duty)
{
    ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_PWM_CH0_CHANNEL, duty); /* 设置占空比 */
    ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_PWM_CH0_CHANNEL);    /* 更新占空比 */
}



//test main
#if 0

void app_main(void)
{
    esp_err_t ret;
    uint8_t dir = 1;
    uint16_t ledpwmval = 0;

    ret = nvs_flash_init();                                         /* 初始化NVS */
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
    {
        ESP_ERROR_CHECK(nvs_flash_erase());
        ret = nvs_flash_init();
    }

    LED_init();
    usart_init(115200); 
    pwm_init(10, 1000); /* 初始化 PWM */
    while(1)
    {
        if (dir == 1)
        {
            /* dir==1,ledrpwmval 递增 */
            ledpwmval += 5;
        }
        else
        {
            /* dir==0,ledrpwmval 递减 */
            ledpwmval -= 5;
        }
        if (ledpwmval > 1005)
        {
            /* ledrpwmval 到达 1005 后，方向改为递减 */
            dir = 0;
        }
        if (ledpwmval < 5)
        {
            /* ledrpwmval 递减到 5 后，方向改为递增 */
            dir = 1;
        }
        /* 设置占空比 */
        pwm_set_duty(ledpwmval);
        printf("Hello-ESP32\r\n");
        vTaskDelay(50);
        
    }
}

#endif 